#include "ntc_temp.h"
#include "sys_timer.h"  // 提供系统滴答计数：uint32_t sys_get_tick_ms(void)
#include <string.h>

// -------------------------- 配置参数 --------------------------
#define NTC_SENSOR_COUNT         4       // 传感器总数
#define NTC_POLL_INTERVAL_MS     50      // 轮询间隔(ms)
#define NTC_TIMEOUT_THRESHOLD_MS 500     // 传感器超时阈值

// 传感器对应的ADC通道映射表
// 索引0~3分别对应4个传感器，内部绑定具体ADC通道
static const AdcChannel sensor_adc_channels[NTC_SENSOR_COUNT] = {
    ADC_CHANNEL_4,  // 传感器0对应ADC通道1
    ADC_CHANNEL_3,  // 传感器1对应ADC通道2
    ADC_CHANNEL_2,  // 传感器2对应ADC通道3
    ADC_CHANNEL_1   // 传感器3对应ADC通道4
};

// -------------------------- 数据结构 --------------------------
typedef struct {
    int16_t temp_c;               // 温度值(-40~125℃，特殊值表示故障)
    bool valid;                   // 数据是否有效
    uint32_t last_update_ms;      // 最后更新时间戳
} NtcSensorData;

// 传感器数据缓存区
static NtcSensorData sensor_data[NTC_SENSOR_COUNT];

// 轮询状态管理
static struct {
    uint8_t current_index;        // 当前轮询的传感器索引(0~3)
    uint32_t next_poll_time;      // 下一次轮询时间
} poll_state = {
    .current_index = 0,
    .next_poll_time = 0
};

// -------------------------- 对外接口实现 --------------------------

/**
 * @brief 初始化NTC传感器轮询系统
 * @retval bool: 初始化结果(true=成功)
 */
void ntc_temp_poll_init(void) 
{
    // 初始化ADC和NTC基础驱动
    if (!ntc_temp_init()) {
        return ;
    }
    
    // 初始化传感器数据缓存
    memset(sensor_data, 0, sizeof(sensor_data));
    for (uint8_t i = 0; i < NTC_SENSOR_COUNT; i++) {
        sensor_data[i].temp_c = 0;
        sensor_data[i].valid = false;
        sensor_data[i].last_update_ms = 0;
    }
    
    // 初始化轮询状态
    poll_state.current_index = 0;
    poll_state.next_poll_time = sys_get_tick_ms();
    return ;
}

/**
 * @brief 传感器轮询处理函数(需在主循环中调用)
 * @note 每个周期仅处理一个传感器，降低系统负载
 */
void ntc_temp_poll_process(void) {
    uint32_t current_time = sys_get_tick_ms();
    
    // 检查是否到达轮询时间
    if (current_time < poll_state.next_poll_time) {
        return;
    }
    
    // 获取当前传感器对应的ADC通道
    AdcChannel channel = sensor_adc_channels[poll_state.current_index];
    
    // 读取温度(调用基础温度读取函数)
    int16_t temp;
    bool result = ntc_read_temperature(channel, &temp);
    
    // 更新传感器数据缓存
    sensor_data[poll_state.current_index].temp_c = temp;
    sensor_data[poll_state.current_index].valid = result;
    sensor_data[poll_state.current_index].last_update_ms = current_time;
    
    // 切换到下一个传感器(循环遍历)
    poll_state.current_index = (poll_state.current_index + 1) % NTC_SENSOR_COUNT;
    
    // 计算下一次轮询时间
    poll_state.next_poll_time = current_time + NTC_POLL_INTERVAL_MS;
}

/**
 * @brief 通过传感器索引获取温度数据
 * @param sensor_index: 传感器索引(0~NTC_SENSOR_COUNT-1)
 * @param temp_c: 输出参数，存储温度值
 * @param valid: 输出参数，存储数据有效性
 * @retval bool: 索引是否有效(true=有效)
 */
bool ntc_temp_get(uint8_t sensor_index, int16_t *temp_c, bool *valid) {
    // 检查参数有效性
    if (sensor_index >= NTC_SENSOR_COUNT || temp_c == NULL || valid == NULL) {
        return false;
    }
    
    // 返回缓存的传感器数据
    *temp_c = sensor_data[sensor_index].temp_c;
    *valid = sensor_data[sensor_index].valid;
    

    return true;
}

/**
 * @brief 获取传感器总数
 * @retval uint8_t: 传感器数量
 */
uint8_t ntc_poll_get_count(void) {
    return NTC_SENSOR_COUNT;
}

/**
 * @brief 检查传感器是否发生故障
 * @param sensor_index: 传感器索引
 * @retval bool: true=有故障，false=正常
 */
bool ntc_temp_is_fault(uint8_t sensor_index) {
    if (sensor_index >= NTC_SENSOR_COUNT) {
        return true;
    }
    
    // 无效数据或超时均视为故障
    if (!sensor_data[sensor_index].valid) {
        return true;
    }
    
    uint32_t elapsed = sys_get_tick_ms() - sensor_data[sensor_index].last_update_ms;
    if (elapsed > NTC_TIMEOUT_THRESHOLD_MS) {
        return true;
    }
    
    // 检查特殊故障码
    int16_t temp = sensor_data[sensor_index].temp_c;
    return (temp == NTC_TEMP_OPEN_CIRCUIT || temp == NTC_TEMP_SHORT_CIRCUIT);
}


//编写获取温度msh命令
void ntc_cmd(int argc, char **argv)
{
    int sensor_index=0;
    if (argc < 2) {
        printf("Usage: ntc <sensor_index>\n");
        for( sensor_index = 0; sensor_index < NTC_SENSOR_COUNT; sensor_index++)
        {
            int16_t temp_c;
            bool valid;
            if (ntc_temp_get(sensor_index, &temp_c, &valid)) {
                printf("Sensor %d: %d°C (%s)\n", sensor_index, temp_c, valid ? "Valid" : "Invalid");
            } else {
                printf("Sensor %d: Error\n", sensor_index);
            }
        }
        return;
    }
     sensor_index = atoi(argv[1]);
    int16_t temp_c;
    bool valid;
    if (ntc_temp_get(sensor_index, &temp_c, &valid)) {
        printf("Sensor %d: %d°C (%s)\n", sensor_index, temp_c, valid ? "Valid" : "Invalid");
    } else {
        printf("Failed to read temperature for sensor %d\n", sensor_index);
    }
}

